package cn.sc.summer.constant.regex;

/**
 * @author a-xin
 * @description 项目所有正则表达式集合, ^表示字符串的起始字符。$表示字符串的末尾。
 * @date 2023/8/3 15:54
 */
public interface RegexConstant {

    /**
     * sql类型正则表达
     */
    String SQL_TYPE_REGEX = "^(\\s*)(INSERT|UPDATE|DELETE|SELECT)(.+)";

    /**
     * js代码方法名正则表达式
     */
    String JS_FUNCTION_NAME = "function\\s+(\\w+)\\s*\\(";

    /**
     * js代码方法参数正则表达式
     */
    String JS_FUNCTION_PARAM = "function\\s+\\w+\\s*\\(([^)]*)\\)";

    /**
     * 金额正则表达式，例如：23.99
     */
    String MONEY_REGEX = "^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$";

    /**
     * 手机号正则表达式，例如：17341787044
     * 中国电信号段
     * 133、153、173、177、180、181、189、190、191、193、199
     * <p>
     * 中国联通号段
     * 130、131、132、145、155、156、166、167、171、175、176、185、186、196
     * <p>
     * 中国移动号段
     * 134(0-8)、135、136、137、138、139、1440、147、148、150、151、152、157、158、159、172、178、182、183、184、187、188、195、197、198
     * <p>
     * 中国广电号段
     * 192
     * <p>
     * 其他号段
     * 14号段部分为上网卡专属号段：中国联通145，中国移动147，中国电信149
     * <p>
     * 虚拟运营商：
     * 电信：1700、1701、1702、162
     * 移动：1703、1705、1706、165
     * 联通：1704、1707、1708、1709、171、167
     * 卫星通信：1349、174
     * 物联网：140、141、144、146、148
     */
    String TEL_REGEX = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$";

    /**
     * 日期正则表达式，考虑闰年，例如：2022-08-23
     */
    String DATE_REGEX = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)";

    /**
     * 身份证号-18位正则表达式，例如：511524199907010632
     */
    String ID_CARD_18_REGEX = "^[1-9][0-9]{5}(18|19|20)[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}([0-9]|(X|x))|^[1-9][0-9]{5}[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{2}[0-9]";

    /**
     * 身份证号-15位正则表达式，例如：511524199907010
     */
    String ID_CARD_15_REGEX = "^[1-9][0-9]{5}[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{2}[0-9]";

    /**
     * ip正则表达式，例如：127.0.0.1
     */
    String IP_REGEX = "^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$";

    /**
     * http网址正则表达式，例如：http://www.baidu.com
     */
    String HTTP_URL_REGEX = "^(?=^.{3,255}$)(http(s)?:\\/\\/)?(www\\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\\d+)*(\\/\\w+\\.\\w+)*([\\?&]\\w+=\\w*)*$";

    /**
     * 邮箱正则表达式，例如：18462123@qq.com
     */
    String EMAIL_REGEX = "^([A-Za-z0-9_\\-\\.])+\\@([A-Za-z0-9_\\-\\.])+\\.([A-Za-z]{2,4})$";

    /**
     * 域名检测正则表达式，例如：qq.com
     */
    String DOMAIN_REGEX = "^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$";

    /**
     * 强密码校验正则表达式，例如：Aa@1234567890
     * （？=.*[0-9]） 表示一个数字必须至少出现一次。
     * （？=.*[a-z]） 表示小写字母表必须至少出现一次。
     * （？=.*[A-Z]） 表示必须至少出现一次的大写字母。
     * （？=.*[@#$%^&-+=（）] 表示必须至少出现一次的特殊字符。
     * （？=\S+$） 整个字符串中不允许使用空格。
     * .{10,20}表示至少 10 个字符，最多 20 个字符。
     */
    String PASSWORD_STRONG_REGEX = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[.()!{}~@#$%^&+=])(?=\\S+$).{10,16}$";

    /**
     * 弱密码校验正则表达式，例如：Abc741258
     * 必须包含数字、大小写字母，且至少六位
     */
    String PASSWORD_WEAK_REGEX = "^(?![0-9A-Z]+$)(?![0-9a-z]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,18}$";

}
